package TP6;

import TP6.VectorEstado.tipoGaseosa;
import java.util.ArrayList;

public class Expendedor {

    private int stockA;
    private int stockB;
    private int stockC;
    private int stockInicialA;
    private int stockInicialB;
    private int stockInicialC;
    private int capacidad;
    private ArrayList<Cliente> clientes;
    private EstadoServidor estado;
    private int contCambiosA = 0;
    private int contCambiosB = 0;
    private int contCambiosC = 0;
    private int contReposiciones = 0;
    
    public Expendedor(int stockInicialA, int stockInicialB, int stockInicialC, int capacidad) {
        if ((stockInicialA + stockInicialB + stockInicialC) > capacidad) {
            throw new IllegalArgumentException("La cantidad de latas cargadas no puede superar la capacidad.");
        }

        this.stockInicialA = stockInicialA;
        this.stockInicialB = stockInicialB;
        this.stockInicialC = stockInicialC;
        stockA = stockInicialA;
        stockB = stockInicialB;
        stockC = stockInicialC;
        this.capacidad = capacidad;
        estado = EstadoServidor.LIBRE;
        clientes = new ArrayList<Cliente>();
    }

    public Expendedor(Expendedor a) {
        this.stockA = a.stockA;
        this.stockB = a.stockB;
        this.stockC = a.stockC;
        this.stockInicialA = a.stockInicialA;
        this.stockInicialB = a.stockInicialB;
        this.stockInicialC = a.stockInicialC;
        this.contCambiosA = a.contCambiosA;
        this.contCambiosB = a.contCambiosB;
        this.contCambiosC = a.contCambiosC;
        this.contReposiciones = a.contReposiciones;
        this.capacidad = a.capacidad;
        this.clientes = (ArrayList<Cliente>) a.clientes.clone();
        this.estado = a.estado;
        
    }

    public int getStockA() {
        return stockA;
    }

    public int getStockB() {
        return stockB;
    }

    public int getStockC() {
        return stockC;
    }

    public int getStockInicialA() {
        return stockInicialA;
    }

    public int getStockInicialB() {
        return stockInicialB;
    }

    public int getStockInicialC() {
        return stockInicialC;
    }

    public int getCapacidad() {
        return capacidad;
    }

    public ArrayList<Cliente> getClientes() {
        return clientes;
    }

    public EstadoServidor getEstado() {
        return estado;
    }

    public void setEstado(EstadoServidor estadoServidor) {
        estado = estadoServidor;
    }

    void addCliente(Cliente nuevoCliente) {
        clientes.add(nuevoCliente);
    }

    public boolean consumirGaseosa(tipoGaseosa gaseosa) {

        switch (gaseosa) {
            case GaseosaA:
                if (stockA > 0) {
                    stockA--;
                } else {
                    return false;
                }
                break;
            case GaseosaB:
                if (stockB > 0) {
                    stockB--;
                } else {
                    return false;
                }
                break;
            case GaseosaC:
                if (stockC > 0) {
                    stockC--;
                } else {
                    return false;
                }
                break;
        }
        return true;
    }

    public VectorEstado.tipoGaseosa consumirCualquierGaseosa() {
        if (stockA > 0) {
            stockA--;
            return tipoGaseosa.GaseosaA;
        }
        if (stockB > 0) {
            stockB--;
            return tipoGaseosa.GaseosaB;
        }
        if (stockC > 0) {
            stockC--;
            return tipoGaseosa.GaseosaC;
        }
        return null;

    }

    public Cliente getClienteEnCola() {
        if (clientes.isEmpty()) {
            return null;
        }

        Cliente primero = clientes.get(0);
        for (Cliente cliente : clientes) {
            if (cliente.getHoraLlegada() < primero.getHoraLlegada()) {
                primero = cliente;
            }
        }

        return primero;
    }

    public void eliminarCliente() {

        for (int i = 0; i < clientes.size(); i++) {

            if (clientes.get(i).getEstado() == EstadoCliente.SIENDO_ATENDIDO) {
                clientes.remove(i);
            }

        }
    }

    public boolean hayGaseosa(tipoGaseosa gaseosa) {
        boolean resul = false;
        switch (gaseosa) {
            case GaseosaA:
                if (stockA > 0) {
                    resul = true;
                }
                break;


            case GaseosaB:
                if (stockB > 0) {
                    resul = true;
                }
                break;


            case GaseosaC:
                if (stockC > 0) {
                    resul = true;
                }
                break;


        }
        return resul;
    }

    public boolean hayAlgunaGaseosa() {
        if (stockA > 0) {
            return true;
        }
        if (stockB > 0) {
            return true;
        }
        if (stockC > 0) {
            return true;
        }
        return false;
    }

    double calcularTiempoReponer() {
        Expendedor aux = new Expendedor(this);
        return aux.reponer();

    }

    /**
     * repone las gaseosas faltanes y cambia el stock inicial de alguna gaseosa si hace falta
     * @return Double Tiempo que tarda en reponer
     */
    public double reponer() {
        // copiar la logica del  repositor del SVN
        contReposiciones++;  // agregar

        double tiempo = 10;
        int cantRetira = 0;

        if (!hayGaseosa(tipoGaseosa.GaseosaA)) {
            // stock B mayor a 50%
            if (stockB >= stockInicialB / 2) {
                // stock C mayor a 50%
                if (stockC >= stockInicialC / 2) {
                    if (stockB >= stockC) {
                        stockInicialB = stockInicialB - 10;
                        stockInicialA = stockInicialA + 10;
                        contCambiosA++;
                        contCambiosB++;
                        if (stockB > stockInicialB) {
                            cantRetira += stockB - stockInicialB;
                            stockB = stockInicialB;
                        }
                    } else {
                        stockInicialC = stockInicialC - 10;
                        stockInicialA = stockInicialA + 10;
                        contCambiosA++;
                        contCambiosC++;
                        if (stockC > stockInicialC) {
                            cantRetira += stockC - stockInicialC;
                            stockC = stockInicialC;
                        }
                    }
                } else {
                    stockInicialB = stockInicialB - 10;
                    stockInicialA = stockInicialA + 10;
                    contCambiosA++;
                    contCambiosB++;
                    if (stockB > stockInicialB) {
                        cantRetira += stockB - stockInicialB;
                        stockB = stockInicialB;
                    }
                }
            } else {
                if (stockC >= stockInicialC / 2) {
                    stockInicialC = stockInicialC - 10;
                    stockInicialA = stockInicialA + 10;
                    contCambiosC++;
                    contCambiosA++;
                    if (stockC > stockInicialC) {
                        cantRetira += stockC - stockInicialC;
                        stockC = stockInicialC;
                    }
                }
            }
        }




        if (!hayGaseosa(tipoGaseosa.GaseosaB)) {
            // stock B mayor a 50%
            if (stockA >= stockInicialA / 2) {
                // stock C mayor a 50%
                if (stockC >= stockInicialC / 2) {
                    if (stockA >= stockC) {
                        stockInicialA = stockInicialA - 10;
                        stockInicialB = stockInicialB + 10;
                        contCambiosA++;
                        contCambiosB++;
                        if (stockA > stockInicialA) {
                            cantRetira += stockA - stockInicialA;
                            stockA = stockInicialA;
                        }
                    } else {
                        stockInicialC = stockInicialC - 10;
                        stockInicialB = stockInicialB + 10;
                        contCambiosC++;
                        contCambiosB++;
                        if (stockC > stockInicialC) {
                            cantRetira += stockC - stockInicialC;
                            stockC = stockInicialC;
                        }
                    }
                } else {
                    stockInicialA = stockInicialA - 10;
                    stockInicialB = stockInicialB + 10;
                    contCambiosA++;
                    contCambiosB++;
                    if (stockA > stockInicialA) {
                        cantRetira += stockA - stockInicialA;
                        stockA = stockInicialA;
                    }
                }
            } else {
                if (stockC >= stockInicialC / 2) {
                    stockInicialC = stockInicialC - 10;
                    stockInicialB = stockInicialB + 10;
                    contCambiosC++;
                    contCambiosB++;
                    if (stockC > stockInicialC) {
                        cantRetira += stockC - stockInicialC;
                        stockC = stockInicialC;
                    }
                }
            }
        }



        // para gaseosa C

        if (!hayGaseosa(tipoGaseosa.GaseosaC)) {
            // stock B mayor a 50%
            if (stockB >= stockInicialB / 2) {
                // stock C mayor a 50%
                if (stockA >= stockInicialA / 2) {
                    if (stockB >= stockA) {
                        stockInicialB = stockInicialB - 10;
                        stockInicialC = stockInicialC + 10;
                        contCambiosB++;
                        contCambiosC++;

                        if (stockB > stockInicialB) {
                            cantRetira += stockB - stockInicialB;
                            stockB = stockInicialB;
                        }
                    } else {
                        stockInicialA = stockInicialA - 10;
                        stockInicialC = stockInicialC + 10;
                        contCambiosC++;
                        contCambiosA++;
                        if (stockA > stockInicialA) {
                            cantRetira += stockA - stockInicialA;
                            stockA = stockInicialA;
                        }
                    }
                } else {
                    stockInicialB = stockInicialB - 10;
                    stockInicialC = stockInicialC + 10;
                    contCambiosB++;
                    contCambiosC++;
                    if (stockB > stockInicialB) {
                        cantRetira += stockB - stockInicialB;
                        stockB = stockInicialB;
                    }
                }
            } else {
                if (stockA >= stockInicialA / 2) {
                    stockInicialA = stockInicialA - 10;
                    stockInicialC = stockInicialC + 10;
                    contCambiosA++;
                    contCambiosC++;
                    if (stockA > stockInicialA) {
                        cantRetira += stockA - stockInicialA;
                        stockA = stockInicialA;
                    }
                }
            }

        }


// reponemos y contamos el tiempo que tarda;
        tiempo = 10; // tiempo base
        tiempo = tiempo + (stockInicialA - stockA) * 1 / 6;
        tiempo = tiempo + (stockInicialC - stockC) * 1 / 6;
        tiempo = tiempo + (stockInicialC - stockC) * 1 / 6;
        stockA = stockInicialA;
        stockB = stockInicialB;
        stockC = stockInicialC;

        if (cantRetira > 0) {
            tiempo = tiempo + cantRetira * 1 / 6 + 2;
        }

        return tiempo;
    }

    public int getContDeCambiosA() {
        return contCambiosA;
    }

    public int getContDeCambiosB() {
        return contCambiosB;
    }

    public int getContDeCambiosC() {
        return contCambiosC;
    }

    int getContReposiciones() {
        return contReposiciones;
    }
}
